const mongoose = require('mongoose');
const glob = require('glob');   // 用于将Schema模型文件都引入到mongoose
const {resolve} = require('path');    // 用于生成绝对路径

const db = 'mongodb://localhost:27017/mall-db';   // 定义数据库的连接路径

exports.initSchemas = () => {   // 导入service/database/schema/下的所有Schema模型
  glob.sync(resolve(__dirname, './schema/', '**/*.js')).forEach(require);  // **/*.js表示引入schema文件夹下面的所有js文件
}

exports.connect  = () => {    // 使用mongoose连接数据库
  let maxConnectTimes = 0;
  let maxErrorTimes = 0;
  return new Promise((resolve, reject) => {
    mongoose.connect(db, {useNewUrlParser:true, useUnifiedTopology:true});  // 第为参数是为了解决node报错

    // 监听数据库断开事件
    mongoose.connection.on('disconnected', () => {
      console.log('*****************数据库断开*****************');
      if (maxConnectTimes < 3) {
        maxConnectTimes++;
        mongoose.connect(db, {useNewUrlParser:true, useUnifiedTopology:true});
      } else {
        reject();
        throw new Error('数据库出现问题，程序无法搞定，请人为修理......')
      }
    });
  
    // 数据库出错事件
    mongoose.connection.on('error', () => {
      console.log('******************数据库出错******************')
      if (maxErrorTimes < 3) {
        maxErrorTimes++;
        mongoose.connect(db, {useNewUrlParser:true, useUnifiedTopology:true});
      } else {
        reject();
        throw new Error('数据库出现问题，程序无法搞定，请人为修理......')
      }
    });
  
    // 数据库成功连接事件
    mongoose.connection.once('open', () => {
      maxConnectTimes = 0; maxErrorTimes = 0;
      console.log('数据库连接成功');
      resolve();
    });
  })

};
